gl renderer: Consolidate color pre-multiplication
authorTimm Bäder <mail@baedert.org>
Fri, 18 Sep 2020 13:26:58 +0000 (15:26 +0200)
committerTimm Bäder <mail@baedert.org>
Fri, 18 Sep 2020 13:45:08 +0000 (15:45 +0200)
Add a common function that tells us what it does and replace all the
manual stuff with it.

Fixes #3170

gsk/resources/glsl/border.glsl
gsk/resources/glsl/color.glsl
gsk/resources/glsl/coloring.glsl
gsk/resources/glsl/linear_gradient.glsl
gsk/resources/glsl/outset_shadow.glsl
gsk/resources/glsl/preamble.glsl
gsk/resources/glsl/radial_gradient.glsl

index 894843cc50aaf3f5eeba8357f8ff4f6ebd8c1ec1..d35c60954c97266ef636f7b5e6a30e1fc997b5fd 100644 (file)
@@ -10,9 +10,7 @@ _OUT_ _ROUNDED_RECT_UNIFORM_ transformed_inside_outline;
 void main() {
   gl_Position = u_projection * u_modelview * vec4(aPosition, 0.0, 1.0);
 
-  final_color = u_color;
-  final_color.rgb *= final_color.a; // pre-multiply
-  final_color *= u_alpha;
+  final_color = premultiply(u_color) * u_alpha;
 
   RoundedRect outside = create_rect(u_outline_rect);
   RoundedRect inside = rounded_rect_shrink (outside, u_widths);
index c80f501ac02078df67e38822e8ceeeceb7331d03..3dc2f1dcb78c08a99346f1adb095f17b72cc36f2 100644 (file)
@@ -6,10 +6,7 @@ _OUT_ vec4 final_color;
 void main() {
   gl_Position = u_projection * u_modelview * vec4(aPosition, 0.0, 1.0);
 
-  final_color = u_color;
-  // Pre-multiply alpha
-  final_color.rgb *= final_color.a;
-  final_color *= u_alpha;
+  final_color = premultiply(u_color) * u_alpha;
 }
 
 // FRAGMENT_SHADER:
index e1b26540c8116967cffc401d5c34c87083268cf8..6342ccb89026b058abdfe01cf12c909a182a493f 100644 (file)
@@ -8,10 +8,7 @@ void main() {
 
   vUv = vec2(aUv.x, aUv.y);
 
-  final_color = u_color;
-  // pre-multiply
-  final_color.rgb *= final_color.a;
-  final_color *= u_alpha;
+  final_color = premultiply(u_color) * u_alpha;
 }
 
 // FRAGMENT_SHADER:
index cffe39294d563c0e744549f948232840dff9f4ee..dea01344f0c8e7697335fea43cc9722fd0944d6b 100644 (file)
@@ -25,10 +25,10 @@ void main() {
 
   for (int i = 0; i < u_num_color_stops; i ++) {
     color_offsets[i] = u_color_stops[(i * 5) + 0];
-    color_stops[i].r = u_color_stops[(i * 5) + 1];
-    color_stops[i].g = u_color_stops[(i * 5) + 2];
-    color_stops[i].b = u_color_stops[(i * 5) + 3];
-    color_stops[i].a = u_color_stops[(i * 5) + 4];
+    color_stops[i] = premultiply(vec4(u_color_stops[(i * 5) + 1],
+                                      u_color_stops[(i * 5) + 2],
+                                      u_color_stops[(i * 5) + 3],
+                                      u_color_stops[(i * 5) + 4]));
   }
 }
 
@@ -66,8 +66,5 @@ void main() {
     }
   }
 
-  /* Pre-multiply */
-  color.rgb *= color.a;
-
   setOutputColor(color * u_alpha);
 }
index 40ef45f648f5f3b6b93ba3568fab8a99b1a778bc..2a2a54ec6be9af3cc873464295abae6c56b609ac 100644 (file)
@@ -10,10 +10,7 @@ void main() {
 
   vUv = vec2(aUv.x, aUv.y);
 
-  final_color = u_color;
-  // pre-multiply
-  final_color.rgb *= final_color.a;
-  final_color *= u_alpha;
+  final_color = premultiply(u_color) * u_alpha;
 
   RoundedRect outline = create_rect(u_outline_rect);
   rounded_rect_transform(outline, u_modelview);
index 9dd711cbd23266e2acdea15e9cc56ac4758e7840..013938899ab231c87f098692a1707afe4935fe47 100644 (file)
@@ -35,3 +35,7 @@ create_rect(vec4[3] data)
 
   return RoundedRect(bounds, corner_points1, corner_points2);
 }
+
+vec4 premultiply(vec4 c) {
+  return vec4(c.rgb * c.a, c.a);
+}
index 84673fc47015e14efb2a77b52719f217104b1932..9d8be275b3e2ac14ff91679db5c06bafc8fbcca9 100644 (file)
@@ -21,10 +21,10 @@ void main() {
 
   for (int i = 0; i < u_num_color_stops; i ++) {
     color_offsets[i] = u_color_stops[(i * 5) + 0];
-    color_stops[i].r = u_color_stops[(i * 5) + 1];
-    color_stops[i].g = u_color_stops[(i * 5) + 2];
-    color_stops[i].b = u_color_stops[(i * 5) + 3];
-    color_stops[i].a = u_color_stops[(i * 5) + 4];
+    color_stops[i] = premultiply(vec4(u_color_stops[(i * 5) + 1],
+                                      u_color_stops[(i * 5) + 2],
+                                      u_color_stops[(i * 5) + 3],
+                                      u_color_stops[(i * 5) + 4]));
   }
 }
 
@@ -50,23 +50,18 @@ float abs_offset(float offset)  {
   return start + ((end - start) * offset);
 }
 
-vec4 premultiply(vec4 c) {
-  vec4 k = vec4(c.rgb * c.a, c.a);
-  return k;
-}
-
 void main() {
   vec2 pixel = get_frag_coord();
   vec2 rel = (center - pixel) / (u_radius);
   float d = sqrt(dot(rel, rel));
 
   if (d < abs_offset (color_offsets[0])) {
-    setOutputColor(premultiply(color_stops[0]) * u_alpha);
+    setOutputColor(color_stops[0] * u_alpha);
     return;
   }
 
   if (d > end) {
-    setOutputColor(premultiply(color_stops[u_num_color_stops - 1]) * u_alpha);
+    setOutputColor(color_stops[u_num_color_stops - 1] * u_alpha);
     return;
   }
 
@@ -85,5 +80,5 @@ void main() {
     }
   }
 
-  setOutputColor(premultiply(color) * u_alpha);
+  setOutputColor(color * u_alpha);
 }